/*******************************************************************************
 * Copyleft (c) 2021 Kcode
 *
 * @file    merge.c
 * @brief   把zoom.c缩放后处理的像素信息存放到Framebuffer中
 * @author  K
 * @version 0.0.1
 * @date    2021-07-26
 * @license MulanPSL-1.0
 *
 * 文件修改历史：
 * <时间>       | <版本>    | <作者>  | <描述>
 * 2021-07-02   | v0.0.1    | Kcode   | 合并图像
 * -----------------------------------------------------------------------------
 ******************************************************************************/

#include <stdlib.h>
#include <string.h>
	
#include "pic_operation.h"
#include "debug_manager.h"

/*!
 * @brief  把小图片合并入大图片里
 * @param x,y[in]         小图片合并入大图片的某个区域, x/y确定这个区域的左上角座标
 * @param ptSmallPic[in]  内含小图片的象素数据
 * @param ptBigPic[in]    内含大图片的象素数据
 * @return 0 - 成功缩放，-1 - 不支持缩放
 */
int PicMerge(int x, int y, PT_PIXELDATAS ptSmallPic, PT_PIXELDATAS ptBigPic)
{
	int i;
	unsigned char *pDst;
	unsigned char *pSrc;
	
	if ((ptSmallPic->width > ptBigPic->width) ||
		(ptSmallPic->height > ptBigPic->height) ||
		(ptSmallPic->bpp != ptBigPic->bpp)) {
		DebugPrint(APP_ERR"SmallPic > BigPic || SmallPic.bpp != BigPic.bpp\n");
		return -1;
	}
	pSrc = ptSmallPic->PixelDatas;
	pDst = ptBigPic->PixelDatas + y * ptBigPic->linebytes + x * ptBigPic->bpp / 8;

	for (i = 0; i < ptSmallPic->height; i++) {
		memcpy(pDst, pSrc, ptSmallPic->linebytes);
		pSrc += ptSmallPic->linebytes;
		pDst += ptBigPic->linebytes;
	}
	return 0;
}

/*!
 * @brief  把新图片的某部分, 合并入老图片的指定区域
 * @param iStartXofNewPic,iStartYofNewPic[in]  
 *             从新图片的(iStartXofNewPic, iStartYofNewPic)开始读出数据用于合并
 * @param iStartXofOldPic,iStartYofOldPic[in]
 *             合并到老图片的(iStartXofOldPic, iStartYofOldPic)去
 * @param ptNewPic[in]    新图片
 * @param ptOldPic[in]    老图片
 * @return 0：成功，其他值：失败
 */
int PicMergeRegion(int iStartXofNewPic, int iStartYofNewPic, 
                int iStartXofOldPic, int iStartYofOldPic, 
            int iWidth, int iHeight, PT_PIXELDATAS ptNewPic, PT_PIXELDATAS ptOldPic)
{
	int i;
	unsigned char *pucSrc;
	unsigned char *pucDst;
    int linebytesCpy = iWidth * ptNewPic->bpp / 8;

	pucSrc = ptNewPic->PixelDatas + iStartYofNewPic * ptNewPic->linebytes + iStartXofNewPic * ptNewPic->bpp / 8;
	pucDst = ptOldPic->PixelDatas + iStartYofOldPic * ptOldPic->linebytes + iStartXofOldPic * ptOldPic->bpp / 8;
	for (i = 0; i < iHeight; i++)
	{
		memcpy(pucDst, pucSrc, linebytesCpy);
		pucSrc += ptNewPic->linebytes;
		pucDst += ptOldPic->linebytes;
	}
	return 0;
}

